package token

import (
	"crypto/rsa"
	"fmt"
	"github.com/dgrijalva/jwt-go"
)

type JwtTokenVerifier struct {
	PublicKey *rsa.PublicKey
}

// Verify 验证 jwt token
func (v *JwtTokenVerifier) Verify(token string) (string, error) {

	t, err := jwt.ParseWithClaims(token, &jwt.StandardClaims{},
		func(token *jwt.Token) (interface{}, error) {
			return v.PublicKey, nil
		})

	if err != nil {
		return "", fmt.Errorf("无法解析token: %v", err)
	}

	if !t.Valid {
		return "", fmt.Errorf("token无效: %v", err)
	}

	clm, ok := t.Claims.(*jwt.StandardClaims)
	if !ok {
		return "", fmt.Errorf("token clamis: %v", err)
	}

	if err := clm.Valid(); err != nil {
		return "", fmt.Errorf("token clamis无效: %v", err)
	}

	return clm.Subject, nil

}
